# -*- coding: utf-8 -*-
# @Time    : 2024/7/1 16:34
# @Author  : yujiahao
# @File    : 16_numpy_chart.py
# @description:NumPy和Matplotlib绘图


'''
Pandas的绘图就是调用NumPy的plot()接口。

Matplotlib 是 Python 的绘图库，它经常与 NumPy 一起使用，从而提供一种能够代替 Matlab 的方案。不仅如此 Matplotlib 还可以与 PyQt 和 wxPython 等图形工具包一起使用。

Matplotlib 最初由 John D. Hunter 编写，目前，它的最新的版本是 3.3.1，最后一个支持 Python 2 的版本是 2.2.5 。

常用的格式化字符：

字符    描述
'-'     实线样式
'--'    短横线样式
'-.'    点划线样式
':'     虚线样式
'.'     点标记
','     像素标记
'o'     圆标记
'v'     倒三角标记
'^'     正三角标记
'<'     左三角标记
'>'     右三角标记
'1'     下箭头标记
'2'     上箭头标记
'3'     左箭头标记
'4'     右箭头标记
's'     正方形标记
'p'     五边形标记
'*'     星形标记
'h'     六边形标记 1
'H'     六边形标记 2
'+'     加号标记
'x'     X 标记
'D'     菱形标记
'd'     窄菱形标记
'|'     竖直线标记
'_'     水平线标记

Matplotlib 还定义了一些颜色字符，如下所示：

字符    颜色
'b'     蓝色
'g'     绿色
'r'     红色
'c'     青色
'm'     品红色
'y'     黄色
'k'     黑色
'w'     白色


'''
import numpy as np
from matplotlib import pyplot as plt

# todo 1、绘制线性函数图像
# Matplotlib 的子模块模块 pyplot 是用来绘制 2D 图像的重要模块。下面示例绘制了函数 y = 2x + 5 的图像：

x = np.arange(1, 11)
y = 2 * x + 5
# 绘制坐标标题
plt.title("Matplotlib demo")
# 绘制x、y轴备注
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.plot(x, y)
plt.show()

# 如果想要以圆点的样式，来代替图 1 中的线条样式，那么可以使用“ ob”作为 plot() 的格式化字符。
plt.plot(x, y, 'ob')
plt.show()

# todo 2、绘制正弦波图

# 使用 Matplotlib 生成正弦波图
# 计算正弦曲线上的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave image")
# 使用matplotlib制图
plt.plot(x, y)
plt.show()

# todo 3、subplot()

"""
subplot() 允许在同一画布中的不同位置绘制多个图像，可以理解为对画布按行、列分割，函数的语法格式如下：

plt.subplot(nrows, ncols, index, **kwargs)

参数说明：该函数使用三个整数数描述子图的位置信息，这三个整数是行数、列数和索引值（此处索引值从1开始），子图将分布在设定的索引位置上。
从右上角增加到右下角。例如，plt.subplot(2, 3, 5) 表示子图位于 2 行 3 列 中的第 5 个位置上。

图例：
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
图中红色部分表示索引位置 5。
"""

# 计算正弦和余弦曲线上的点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 绘制subplot 网格为2行1列
# 激活第一个 subplot
plt.subplot(2, 1, 1)
# 绘制第一个图像
plt.plot(x, y_sin)
plt.title('Sine')
# 将第二个 subplot 激活，并绘制第二个图像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 展示图像
plt.show()

# todo 4、bar()柱状图
# pyplot 子模块中提供了 bar() 函数来生成柱状图。
# 第一组数据
x1 = [5, 8, 10]
y1 = [12, 16, 6]
# 第二组数据
x2 = [6, 9, 11]
y2 = [6, 15, 7]
plt.bar(x1, y1, align='center')
plt.bar(x2, y2, color='g', align='center')
plt.title('Bar graph')
# 设置x轴与y轴刻度
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()

# todo 5、numpy.histogram()
'''
直方图是一种表示数据概率分布的常用图形。NumPy 提供了 histogram() 函数，它以直方图的形式表示一组数据的概率分布值。

histogram() 函数有两个返回值，分别是 hist 与 bin_edges，分别代表直方图高度值与 bin 数值区间范围， 函数的语法格式如下：
histogram(array,bins=10,range=None,weights=None,density=False)
'''
a = np.arange(8)
hist, bin_edges = np.histogram(a, density=True)

a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
hist, bins = np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
print(hist)
print(bins)

# todo 6、plt()
'''pyplot 子模块的 plt() 函数将一个输入数组和 bins 数组作为参数，并将其输出为直方图。'''
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
plt.hist(a, bins=[0, 20, 40, 60, 80, 100])
plt.title("histogram")
plt.show()
